package jmine.tec.hydra.mock;

import jmine.tec.di.annotation.Injected;
import jmine.tec.hydra.api.HydraMessage;
import jmine.tec.hydra.domain.MockEntity;
import jmine.tec.hydra.domain.message.HydraConversation;
import jmine.tec.services.annotations.Execution;
import jmine.tec.services.annotations.Input;
import jmine.tec.services.annotations.ServiceImplementor;
import jmine.tec.services.annotations.Validation;
import jmine.tec.services.api.ActionsEnum;
import jmine.tec.services.api.ServiceAssertionFailedError;
import jmine.tec.services.api.ServicesAPIMessages;
import bancosys.tec.persist.dao.BaseDAO;

/**
 * Serviço de teste para execução do script SEL1052R1
 * 
 * @author piercio
 */
@ServiceImplementor(serviceName = "Hydra", action = ActionsEnum.ALTERAR)
public class MockHydraService {

    private static final String SIT_OP = "ATU";

    private static final String NUM_OP = "123456";

    private String numOp;

    private String sitOp;

    private HydraConversation conversation;

    private HydraMessage message;

    /**
     * Associa uma mensagem e uma conversa a uma entidade, comportamento usual de serviços chamados no recebimento de uma mensagem.
     */
    @Execution
    public void execute(@Injected BaseDAO<MockEntity> daoMyEntity) {
        MockEntity entity = daoMyEntity.createBean();
        entity.setMessage(this.message);
        entity.setConversation(this.conversation);
        entity.getPersister().save();
    }

    /**
     * Verifica se os dados obtidos pela geração do serviço correspondem ao esperado.
     */
    @Validation
    public void validate() {
        if (!this.numOp.equals(NUM_OP) || !this.sitOp.equals(SIT_OP) || this.message == null || this.conversation == null) {
            throw new ServiceAssertionFailedError(
                    ServicesAPIMessages.VALIDATION_VALIDATION_ERROR.create("Erro executanto o serviço: esperado (123456, ATU), obtido ("
                            + this.numOp + ", " + this.sitOp + ")"));
        }
    }

    /**
     * @return o valor do campo numOp
     */
    public String getNumOp() {
        return this.numOp;
    }

    /**
     * @param numOp o valor para o campo numOp
     */
    @Input(fieldName = "NumOpSEL")
    public void setNumOp(String numOp) {
        this.numOp = numOp;
    }

    /**
     * @return o valor do campo sitOpSel
     */
    public String getSitOp() {
        return this.sitOp;
    }

    /**
     * @param sitOpSel o valor para o campo sitOpSel
     */
    @Input(fieldName = "SitOpSEL")
    public void setSitOp(String sitOpSel) {
        this.sitOp = sitOpSel;
    }

    /**
     * @param hydraConversation o valor para o campo hydraConversation
     */
    @Input(fieldName = "HydraConversation", required = false)
    public void setHydraConversation(HydraConversation hydraConversation) {
        this.conversation = hydraConversation;
    }

    /**
     * @param hydraMessage o valor para o campo hydraConversation
     */
    @Input(fieldName = "HydraMessage")
    public void setHydraMessage(HydraMessage hydraMessage) {
        this.message = hydraMessage;
    }
}
